package l1j.server.server.clientpackets;


import l1j.opqlo.NewSystem.ChatLog;
import l1j.opqlo.Server.L1World.L1World;
import l1j.opqlo.假人系統.DummyThread;
import l1j.server.Config;
import l1j.server.echo.ClientThread;
import l1j.server.server.model.Instance.L1PcInstance;
import l1j.server.server.serverpackets.S_ChatPacket;
import l1j.server.server.serverpackets.S_ServerMessage;
import l1j.server.server.serverpackets.S_SystemMessage;

import java.util.logging.Level;
import java.util.logging.Logger;
/**
 * 處理收到由客戶端傳來的密語封包
 */
public class C_ChatWhisper extends ClientBasePacket {

	private static final String C_CHAT_WHISPER = "[C] C_ChatWhisper";
	private static final int GMSTATUS_WHISPER = 1026;
	private static final Logger _log = Logger.getLogger(C_ChatWhisper.class.getName());
	private static final int S_OPCODE_GLOBALCHAT = 106;/** 廣播聊天頻道 */
	private static final int S_OPCODE_WHISPERCHAT = 126;
	/**密語竊聽**/
	private static final String _Whisper ="\\fV【密語】";
	@Override
	public String getType() {
		return C_CHAT_WHISPER;
	}

	@Override
	public void start(final byte[] decrypt, final ClientThread client) {
		try {
			// 資料載入
			this.read(decrypt);
			
			final L1PcInstance whisperFrom = client.getActiveChar();
			// チャット禁止中の場合
			if(whisperFrom == null){
				return;
			}
			final String targetName = this.readS();
			if(targetName == null){
				return;
			}
			if (whisperFrom.hasSkillEffect(1005)) {
				whisperFrom.sendPackets(new S_ServerMessage(242)); // 現在チャット禁止中です。
				return;
			}
			if(whisperFrom._inFighting ==1 || whisperFrom._inFighting==3){
				whisperFrom.sendPackets(new S_ServerMessage(242)); // 現在チャット禁止中です。
				return;
			}
			
			final String text = this.readS();
			if(text == null){
				return;
			}
	
			// ウィスパー可能なLv未満の場合
			if (whisperFrom.getLevel() < Config.WHISPER_CHAT_LEVEL) {
				whisperFrom.sendPackets(new S_ServerMessage(404, String
						.valueOf(Config.WHISPER_CHAT_LEVEL))); // %0レベル以下ではウィスパー、パーティーチャットは使用できません。
				return;
			}
			final L1PcInstance whisperTo = L1World.getInstance().getPlayer(targetName);
			// ワールドにいない場合
			if (whisperTo == null) {
				if(DummyThread.getInstance().checkNameOnline(targetName)){
					whisperFrom.sendPackets(new S_ChatPacket(targetName, text,S_OPCODE_GLOBALCHAT));
					return;
				}
				whisperFrom.sendPackets(new S_ServerMessage(73, targetName)); // \f1%0はゲームをしていません。
				return;
			}
			// 自分自身に対するwisの場合
			if (whisperTo.equals(whisperFrom)) {
				return;
			}
			// 遮断されている場合
			if (whisperTo.getExcludingList().contains(whisperFrom.getId())) {
				whisperFrom.sendPackets(new S_ServerMessage(117, whisperTo.getName())); // %0があなたを遮断しました。
				return;
			}
			// ゲームオプションでOFFにしている場合
			if (!whisperTo.isCanWhisper()) {
				whisperFrom.sendPackets(new S_ServerMessage(205, whisperTo.getName()));
				return;
			}

			//TODO 密不到GM
			if (!whisperFrom.isGm() && whisperTo.isGm() && whisperTo.hasSkillEffect(GMSTATUS_WHISPER)) {
				whisperFrom.sendPackets(new S_ServerMessage(73, whisperTo.getName()));// \%0 不在線上。
				return;
			}
			//TODO 密不到GM

			//ChatLogTable.getInstance().storeChat(whisperFrom, whisperTo, text, 1);
			//TODO 管理者介面byeric1300460
			/*	if(Config.GUI) {
			J_Main.getInstance().addPrivateChat(whisperFrom.getName(),whisperTo.getName(), text);
		}*/
			//TODO 管理者介面byeric1300460
			whisperFrom.sendPackets(new S_ChatPacket(whisperTo, text,S_OPCODE_GLOBALCHAT, 9));
			whisperTo.sendPackets(new S_ChatPacket(whisperFrom, text,S_OPCODE_WHISPERCHAT, 16));
			// TODO 密語竊聽

			StringBuilder buff = new StringBuilder();
			if(!L1World.getInstance().getAllGms().isEmpty()){
				buff.append(_Whisper).append(whisperFrom.getName()).append("對").append(targetName).append(":").append(text);
				S_SystemMessage msg = new S_SystemMessage(buff.toString());
				buff.delete(0, buff.length());
				for (final L1PcInstance GM : L1World.getInstance().getAllGms()) {
					if(GM.isOverHead()){//opqlo 竊聽開關
						if (whisperFrom != GM && whisperTo != GM) {
							GM.sendPackets(msg);
						}
					}
				}
			}
			buff.append(whisperFrom.getName()).append(" 對 ").append(targetName).append("	: ").append(text);
			ChatLog.get().setLog(client.getIp(), 1, buff);
			buff.delete(0, buff.length());
		} catch (final Exception e) {
			_log.log(Level.SEVERE, e.getLocalizedMessage(), e);

		} finally {
			this.over();
		}
	}
}
